終於來到了第九天,今天要再更深入介紹函式(Function)以及 Function Receiver(Methods)在做什麼,那麼話不多說,我們就開始吧 ─=≡Σ(((っ゚∀゚)っ
可以把 Function 想像成一台機器,當我們把丟給他一個輸入值,他就會回給我們一個輸出值,而要怎麼處裡這個輸出值,就會在函式內進行處理。
在 Go 使用 func 來定義函式:
1. 一般宣告: func 函式名稱(參數) return T { to do...}
package main
import "fmt"
func main() {
fmt.Println(add(1, 2))
}
func add(x int, y int) int {
return x + y
}
2. Expression
使用 :=
定義函式
package main
import "fmt"
func main() {
add := func(x, y int) int {
return x + y
}
fmt.Println(add(1, 2))
}
其實函式的使用方法跟多數程式語言的用法相比大同小異,倒是方法讓我搞混了相當久,你跟函式不是長得一樣嗎!
但其實他們在定義上有點不一樣,方法(Methods)指的是作用在某個「物件」上的函式,可以先來看看方法在使用時的情境:
package main
import "fmt"
type Cat struct {
name string
age int
}
func (c Cat) getName() string {
return c.name
}
func main() {
cat := Cat{name: "BuiBui", age: 5}
fmt.Println(cat.getName())
}
首先先定義了一個 struct Cat
,並且在 main 函式內宣告一個 Cat
屬性的變數,而這個 cat
變數可以呼叫 getName
這個方法。
咦,那麼為什麼 cat
會有 getName
這個方法可以用呢?
注意看的話會發現 getName
與 func
中間有多了一欄的參數,而這就是 receiver 以及他做的一些手腳。(c Cat)
後面的 Cat
會綁定在 Cat
這個屬性上,而前方的 c
則是呼叫這個方法的變數。
雖然在 Go 裡面並沒有物件導向,但能藉由 receiver 來實作出「實體方法」。如果知道物件導向的話,應該對這件行為就不會太陌生。
以 Ruby 作為物件導向的例子,當我有個 Cat 類別,而 say_hello
則是 Cat 的實體方法,該如何使用呢?
class Cat
def initialize(name)
@name = name
end
def say_hello
puts "Hello, my name is #{@name}"
end
end
想要建立一個 Cat 實體,會使用 cat = Cat.new(name: 'Kitty')
,而建立的實體就能透過 .
的方法使用 say_hello
這個方法:
p cat.say_hello
# => Hello, my name is Kitty.
有在寫 Ruby 的話,應該都知道 Ruby 沒有函式,因為 Ruby 所以東西都是物件。
一開始雖然不太懂 recevier 的運作,方法其實也只是多了 recevier 參數的函式,最後能以物件導向的方式思考好像就更能理解了。
在辦公室寫文章,有很多朋友邊對我比讚邊回家,感到無比溫馨又淒涼 Q_Q
一天又平安的過去了,有任何問題歡迎留言與我告知 :)